package view;

import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Parent;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

/**
 * 自定义窗口，继承Stage
 * 作为所有窗口的基类取代系统默认窗口
 * 需要实现关闭和最小化窗口两个方法
 */
public abstract class Window extends Stage {
    Parent root;

    private double xOffset;
    private double yOffset;

    public Parent getRoot() {
        return root;
    }

    /**
     * 使用lookup方法根据id获得对应的界面元素，用法和android中的findViewById一样
     * 返回值需要家强转
     * eg、Button button = (Button)findViewById("id");
     * @param id
     * @return
     */
    public Object findViewById(String id) {
        return (Object) root.lookup("#" + id);
    }

    /**
     * 关闭窗口
     */
    public abstract void quit();

    /**
     * 最小化窗口
     */
    public abstract void minimize();

    /**
     * 移动窗口方法
     */
    public void move() {

        /**
         * 当鼠标点击窗口时计算此时窗口的（x，y）坐标，用于移动窗口。
         * 像这种匿名方法完全可以使用Lambda表达式来简化代码
         * Lambda表达式的优点：
         * 取代大部分的匿名内部类，使代码变的更加简洁紧凑。
         */
        root.setOnMousePressed(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                xOffset = getX() - event.getScreenX();
                yOffset = getY() - event.getScreenY();
                getRoot().setCursor(Cursor.CLOSED_HAND);
            }
        });

        /**
         * 当鼠标拖拽窗口时移动窗口
         */
        root.setOnMouseDragged(event -> {
            setX(event.getScreenX() + xOffset);
            setY(event.getScreenY() + yOffset);
        });

        /**
         * 当松开窗口时将鼠标样式还原
         */
        root.setOnMouseReleased(event -> {
            getRoot().setCursor(Cursor.DEFAULT);
        });

    }
}
